﻿#ifndef PST_FRAMELESSDRAGABLETABLEWIDGET_H
#define PST_FRAMELESSDRAGABLETABLEWIDGET_H

#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QSizeGrip>
#include <QTableWidget>
#include <QMouseEvent>
#include <QHeaderView>
#include <QTableWidgetItem>
#include "IdaWidgetHelper.h"

namespace pst
{

    // 自定义无边框浮动窗口（作为子窗口）包含一个 QTableWidget
    class FramelessDragableTableWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit FramelessDragableTableWidget(QWidget* parent = nullptr)
            : QWidget(parent), m_dragging(false)
        {
            // 由于该组件作为父容器内的浮动面板显示，
            // 使用 Qt::SubWindow 标志确保它拥有自己的窗口句柄，
            // 使得 QSizeGrip 操作时针对本身进行，而非父窗口
            setWindowFlags(Qt::FramelessWindowHint | Qt::SubWindow);
            setMinimumSize(100, 100);

            // 为了方便观察，设置一下边框
            //setStyleSheet("background-color: white; border: 1px solid black;");

            // 创建 QTableWidget（这里只是演示，可根据实际需求调整行列数）
            table = new QTableWidget(this);
            table->setSelectionBehavior(QAbstractItemView::SelectRows);
            //for (int i = 0; i < 10; ++i)
            //{
            //    for (int j = 0; j < 3; ++j)
            //    {
            //        table->setItem(i, j, new QTableWidgetItem(QString("Item %1-%2").arg(i).arg(j)));
            //    }
            //}
            //// 为使整个窗口都能用于拖动（而非让 QTableWidget 截获鼠标事件），
            //// 设置表格忽略所有鼠标事件
            //// table->setAttribute(Qt::WA_TransparentForMouseEvents);
            //table->setStyleSheet("background-color: lightgray;");

            // 用布局将表格充满整个区域
            QVBoxLayout* layout = new QVBoxLayout(this);
            layout->setContentsMargins(20, 20, 0, 0);
            IdaWidgetHelperInstance->setTableWidgetStyle(table);
            layout->addWidget(table);
            setLayout(layout);

            // 在窗口右下角放置 QSizeGrip，用于调整本组件大小
            sizeGrip = new QSizeGrip(this);
            sizeGrip->raise(); // 保证它始终在最前面显示
        }

        QTableWidget* getInnerTableWidget()
        {
            return table;
        }

    protected:
        // 重写鼠标事件：在整个组件（包括表格区域，由于表格已“透传”鼠标）上拖窗
        void mousePressEvent(QMouseEvent* event) override
        {
            if (event->button() == Qt::LeftButton)
            {
                // 用 mapToGlobal(QPoint(0,0)) 获取组件当前全局坐标，
                // 计算鼠标点击处与组件左上角的偏移量
                m_dragOffset = event->globalPos() - this->mapToGlobal(QPoint(0, 0));
                m_dragging = true;
            }
            //QWidget::mousePressEvent(event);
        }
        void mouseMoveEvent(QMouseEvent* event) override
        {
            if (m_dragging)
            {
                // 计算新全局左上角
                QPoint newGlobalTopLeft = event->globalPos() - m_dragOffset;
                // 如果有父容器，则将新位置转换为父容器坐标，并限制范围
                if (parentWidget())
                {
                    QPoint newLocalPos = parentWidget()->mapFromGlobal(newGlobalTopLeft);
                    // 限制拖动范围：保证整个组件位于父容器内
                    int x = newLocalPos.x();
                    int y = newLocalPos.y();
                    int maxX = parentWidget()->width() - width();
                    int maxY = parentWidget()->height() - height();
                    if (x < 0)
                        x = 0;
                    if (y < 0)
                        y = 0;
                    if (x > maxX)
                        x = maxX;
                    if (y > maxY)
                        y = maxY;
                    newLocalPos = QPoint(x, y);
                    move(newLocalPos);
                }
                else
                {
                    move(newGlobalTopLeft);
                }
            }
            //QWidget::mouseMoveEvent(event);
        }
        void mouseReleaseEvent(QMouseEvent* event) override
        {
            m_dragging = false;
            //QWidget::mouseReleaseEvent(event);
        }

        //void wheelEvent(QMouseEvent* event) override
        //{

        //}
        bool event(QEvent* e) override
        {
            if (e->type() == QEvent::Wheel)
            {
                e->accept(); // 阻止事件传播
                return true; // 表示事件已处理
            }
            return QWidget::event(e); // 继续处理其他事件
        }
        // 重写 resizeEvent：调整 QSizeGrip 的位置，使其始终位于右下角
        void resizeEvent(QResizeEvent* event) override
        {
            QWidget::resizeEvent(event);
            QSize gripSize = sizeGrip->sizeHint();
            sizeGrip->setGeometry(width() - gripSize.width(),
                height() - gripSize.height(),
                gripSize.width(), gripSize.height());
        }

    private:
        QTableWidget* table;
        QSizeGrip* sizeGrip;
        bool m_dragging;
        QPoint m_dragOffset;
    };

} // namespace pst
#endif
